﻿#include<stdio.h>
#include<string.h>

/*printf("Five字节数为%d\n", sizeof(Five) );
	printf("For的字节数为%d\n", sizeof(Four));
	printf("Three的字节数为%d\n", sizeof(Three));
	printf("One的字节数为%d\n",sizeof(One));
	printf("Two的字节数为%d\n", sizeof(Two));
	CC cc;
	cc.a.c;//访问变量a


	//访问变量b
	A aaa;
	aaa.c.b;


	hero arr[3] =
	{
		{10,"剑圣",5},
		{5,"盖伦",10},
		{0,"法师",0}
	};
	for (int i = 0; i < 3; i++)
	{
		printf("%d\t%s\t%d\n", arr[0].ATT, arr[0].name, arr[0].Def);
	}
	

	s1 = {1,2};//表示s1的变量，对应int a int b,不表示对象，也不表示变量名
	//就是结构的变量名

	s3[0] = {1,2};
	s1 = { 1,2 };

	STT tt;
	tt.a;

	hero YX1{10,"剑圣",5};
	YX1.ATT;


	int a=10;
	int b=20;
	
	//Student aa = {12,"循环",60.1f};
	//aa.ID = 10;//初始化
	//strcpy(aa.name,"张三");
	//aa.score = 1.6;*/



//结构体定义：struct
/*
	struct  结构体名
	{
		结构成员
	}

*/
//赋值：一一对应
// 
// 整么访问定义的结构体变量里面的成员   变量名.
//定义一个名字叫做student的结构
//typedef  表示给类型(基本数据类型等)取别名
//typedef int 整型;

/*//给结构变量取别名
typedef struct Hero//给Hero取别名，名称叫hero
{
	int ATT;
	char name[10];
	int Def;
}hero;

//定义结构体的时候没有写结构名，那么typedef就要给结构体取别名
//在括号末尾是结构体的名字
 typedef struct
{

	int a;
	int b;
}STT;

struct Student
{
	int ID;
	char name[10];
	float score;
};
//
Student ab = {2,"李四",90.9f};
//student ab={第一个赋值给第一个定义的成员，第二个赋值给第二个定义的成员...}


//定义结构体的时候没有写结构名，也没有typedef取别名，但是在}后面写了标识符
//那么这几个标识符就是我们定义的结构的变量
struct 
{
	int a;
	int b;
} s1,s2,s3[10];//定义结构体的时候，没有写结构名的时候，也没有加typedef的时候，就不是别名，就是直接的变量


//结构体的嵌套
struct A
{
	int  a;
	struct 
	{
		int b;
	}c;
};


struct CC
{
	struct A a;
};


//结构体的内存计算方法
struct One
{
	int a;
	int b;
	char c;

};
//内存对齐标准：以该结构体中最大的基本数据类型所占的内存进行对齐

struct Two {
	int a;
	char b[10];
	float c;

};

struct Three
{
	double a;
	int b;
	char c[10];
};

struct Four
{
	int a;//占4个字节
	char b[10];
	char c;
	int d;
};


//当结构的数据成员有更大的数据类型所占内存，先按照顺序按最大的进行对齐
//如果在最后面还有比前面更大的基本数据类型所占内存，那么就按照更大的进行对齐
struct Five
{
	char a;
	int b;
	char c[10];
	double d;
};*/




//struct 结构名
//{
//	结构成员
//};

/*
如何访问定义的结构体变量里面的成员  变量名.成员
*/




//定义名字叫Student的结构
//struct Student
//{//每一个成员只能存一个变量，一个变量只能存一个数据
//	int ID;
//	char name[10];
//	float score;
//};
//
//
//Student ab = { 2,"历时",90.9f };
//Student ab={第一个值赋值给第一个定义的成员，第二个值赋值给第二个定义的成员}//初始化


//#define 表示宏定义  宏的原理表示替换
//typedef  给类型取别名
//typedef int 整型;
//
//
////给结构变量取别名   别名的名称叫hero
//typedef struct  Hero
//{
//	int ATT;
//	char name[10];
//	int def;
//
//
//}hero;
//
////若定义结构体的时候没有写结构名，那么typedef就会给这个结构取别名  别名在末尾STT
//typedef struct 
//{
//	
//	int a;
//	int b;
//}STT;
//
//
////若定义结构体的时候没有写结构名，也没有typedef，但是在{}后写了标识符
////那么这几个标识符就是定义的该结构变量
//struct 
//{
//	int a;
//	int h;
//}s1,s2,s3[10];//没有结构名也没有别名时，就是直接的变量
//
////结构体的嵌套
//struct A
//{
//	int a;
//	struct 
//	{
//		int b;
//	}c;
//};
//
//
//struct CC
//{
//	struct A a;
//};



//结构体的内存计算方法
struct One
{
	int a; //4
	int b; //4
	char c;//1
};


//内存对其标准：以该结构体中最大的数据类型所占的内存进行对齐

struct Two
{
	int a;//4
	char b[10];//10  多出两个也占4个字节
	float c;//4
};


struct Three
{
	double a;//8
	int b;//4
	char c[10];//10
};

struct Four {
	int a;//4
	char b[10];//10
	char c;//1
	double d;//8
};


//当数据成员前面有更大的数据类型所占内存，先按照顺序最大的数据类型进行内存分配对齐
//如果在最后面还有比前面更大的基本数据类型所占内存，那么就按照更大的进行对齐
struct Five
{
	char a;//1
	int b;//4  先按照int进行对其
	char c[10];//10
	double d;//8   再按double进行对齐
};


int main()
{
	printf("one的字节数%d\n", sizeof(One));//12
	printf("Two的字节数%d\n", sizeof(Two));//20
	printf("Three的字节数%d\n", sizeof(Three));//24
	printf("Four的字节数%d\n", sizeof(Four));//24
	printf("Five的字节数%d\n", sizeof(Five));//32


	//CC zy;//zy是cc的对象
	//zy.a.c;//结构体的嵌套

	//A aaa;//访问A中的变量b
	//aaa.a;
	//aaa.c;


	//hero arr[3] = {//有4个英雄
	//	{10,"剑圣",5},
	//	{2,"盖伦",10},
	//	{0,"法师",0}
	//};
	//for (int i = 0; i < 3; i++)
	//{
	//	printf("%d\t%s\td\n", arr[i].ATT, arr[i].name, arr[i].def);//结构体数组进行输出
	//}
	//printf("%d\t%s\td\n", arr[0].ATT, arr[0].name, arr[0].def);//数组进行输出



	//s1 = { 1,2 };//s1就表示里面的变量
	//s1.a;

	//STT tt;
	//tt.a;


	//hero YX1 = {10,"剑圣",5};
	//YX1.ATT;//YX1可以点出里面所具备的成员


	//int a;
	//int b;
	
	//Student aa = {1,"zh",60.1f};//定义结构类型的变量   只能赋值为结构体内的成员  在变量后面加{}，一一对应，进行赋值
	//aa.ID = 10;
	//strcpy(aa.name,"张三");//赋值，初始化
	//aa.score = 1.6f;
	//aa.name="张三"   不能进行这样初始化
	//char Name[10];
	//Name = "zhang";


	return 0;
}